# 包装类型识别逻辑实现

import pandas as pd
from src.config.constants import PACKAGE_TYPE


def identify_package_type(data, merged_cells_info=None):
    """识别包装类型

    根据项目大纲2.3.1.3节定义：
    - 组合包装：当"包装箱方案"列的某单元格为合并单元格时，该合并单元格所包含的所有行构成一个组合包装
    - 独立包装：当"包装箱方案"列的某单元格为非合并单元格时，该行构成一个独立包装

    Args:
        data: 待识别的数据
        merged_cells_info: 合并单元格信息

    Returns:
        包含包装类型信息的数据
    """
    result = data.copy()

    # 如果没有包装类型字段，添加该字段
    if "包装类型" not in result.columns:
        result["包装类型"] = ""

    # 初始化所有行为独立包装类型
    result["包装类型"] = PACKAGE_TYPE["INDEPENDENT"]

    # 如果没有合并单元格信息或数据为空，返回默认值
    if merged_cells_info is None or data.empty:
        return result

    # 检查是否有"包装箱方案"列
    if "包装箱方案" not in data.columns:
        return result

    # 查找"包装箱方案"列的索引
    package_scheme_col_index = None
    for i, col_name in enumerate(data.columns):
        if col_name == "包装箱方案":
            package_scheme_col_index = i
            break

    if package_scheme_col_index is None:
        return result

    # 处理合并单元格信息，标记组合包装
    for merged_cell in merged_cells_info:
        # 只处理"包装箱方案"列的合并单元格
        if (
            merged_cell["column_name"] == "包装箱方案"
            and merged_cell["min_col"] == merged_cell["max_col"]
            and merged_cell["min_col"] == package_scheme_col_index
        ):
            # 标记该合并单元格内的所有行为组合包装
            for row_idx in range(
                merged_cell["min_row"], merged_cell["max_row"] + 1
            ):
                if row_idx < len(result):
                    result.at[row_idx, "包装类型"] = PACKAGE_TYPE[
                        "COMBINATION"
                    ]

    return result


def identify_package_type_from_file(file_path, sheet_name=0, header=0):
    """从文件中识别包装类型

    这个方法会读取Excel文件并保留合并单元格信息，然后基于合并单元格特征判断包装类型

    Args:
        file_path: Excel文件路径
        sheet_name: 工作表名称或索引，默认为0
        header: 表头行索引，默认为0

    Returns:
        包含包装类型信息的数据
    """
    # 导入ExcelUtils类（避免循环导入）
    from src.utils.excel_utils import ExcelUtils

    excel_utils = ExcelUtils()

    # 读取Excel文件并保留合并单元格信息
    df, merged_cells_info = excel_utils.read_excel_with_merged_cells_info(
        file_path, sheet_name=sheet_name, header=header
    )

    # 识别包装类型
    result = identify_package_type(df, merged_cells_info)

    return result
